`
https://leetcode.cn/problems/binary-tree-coloring-game/
`

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} n
 * @param {number} x
 * @return {boolean}
 */
var btreeGameWinningMove = function (root, n, x) {
  // 定义：在以 root 为根的二叉树中搜索值为 x 的节点并返回
  const find = (root, x) => {
    if (root === null) {
      return null;
    }
    if (root.val === x) {
      return root;
    }
    // 去左子树找
    var left = find(root.left, x);
    if (left !== null) {
      return left;
    }
    // 左子树找不到的话去右子树找
    return find(root.right, x);
  }

  // 定义：计算以 root 为根的二叉树的节点总数
  var count = (root) => {
    if (root === null) {
      return 0;
    }
    return 1 + count(root.left) + count(root.right);
  }

  // 寻找值为 x 的结点
  const node = find(root, x)
  // 计算该结点的左子树有多少个结点
  const leftCount = count(node.left)
  // 计算该结点的右子树有多少个结点
  const rightCount = count(node.right)
  // 计算该结点的父结点和父结点的右子树一共有多少个结点
  const otherCount = n - 1 - leftCount - rightCount

  // 三块区块的结点总数有一个比总结点数的一半还大，就有可能赢
  // https://labuladong.online/algo/images/brief-extra/1145.png
  return Math.max(leftCount, rightCount, otherCount) > Math.floor(n / 2)
};